//package com.platform.tony.config;
//
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
//import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
//import org.springframework.security.config.annotation.web.builders.WebSecurity;
//import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
//import org.springframework.security.core.userdetails.User;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.crypto.password.NoOpPasswordEncoder;
//import org.springframework.security.crypto.password.PasswordEncoder;
//import org.springframework.security.provisioning.InMemoryUserDetailsManager;
//import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
//import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
//import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
//import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
//
//import javax.sql.DataSource;
//
//
//@Slf4j
//@Configuration
//@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
//public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
//
//    @Autowired
//    private DataSource dataSource;
//
//    // 持久化令牌桶
//    @Bean
//    public PersistentTokenRepository persistentTokenRepository() {
//        // InMemoryTokenRepositoryImpl node = new InMemoryTokenRepositoryImpl();
//        JdbcTokenRepositoryImpl node = new JdbcTokenRepositoryImpl();
//        node.setCreateTableOnStartup(false);
//        node.setDataSource(dataSource);
//        return node;
//    }
//
//    @Override
//    protected void configure(HttpSecurity http) throws Exception {
//
//        // 配置 authorize
//        http.authorizeRequests()
//                .antMatchers("/**/*.js", "*.jpg", "/**/*.css").permitAll()
//                .antMatchers("/login", "/login/form").permitAll()
//                .mvcMatchers("/vc.jpg").permitAll()
//                .anyRequest().authenticated();
//        // 登录页面 form login
//        http.formLogin()
//                .loginPage("/login") // 登录页面
//                .loginProcessingUrl("/login/form") // 登录请求访问路径
//                // .defaultSuccessUrl("/home", true) // 登录成功跳转路径 重定向
//                .successForwardUrl("/home")  // 转发
//                .failureForwardUrl("/login")
//                // .successHandler()
//                // .failureHandler()
//                // .successForwardUrl("")
//                .passwordParameter("password")
//                .usernameParameter("username");
//        // logout 配置
//        http.logout()
//                // .logoutUrl("logout")
//                .logoutRequestMatcher(new AntPathRequestMatcher("logout", "GET"))
//                .invalidateHttpSession(true)
//                .clearAuthentication(true);
//
//        // session 管理
//        http.sessionManagement().maximumSessions(20);
//        // csrf 配置
//        // http.csrf().disable();
//        // 权限不足
//        http.exceptionHandling().accessDeniedPage("/403");
//        // 记录登录
//        http.rememberMe()
//                .rememberMeParameter("rememberMe")
//                .tokenRepository(persistentTokenRepository())
//                .tokenValiditySeconds(30 * 60)
//                .userDetailsService(detailsService());
//
//
//        // 添加动态验证码
//        http.addFilterAt(kaptchaFilter(), UsernamePasswordAuthenticationFilter.class);
//
//    }
//
//    @Bean
//    public KaptchaFilter kaptchaFilter() throws Exception {
//        KaptchaFilter kaptchaFilter = new KaptchaFilter();
//        //指定接收验证码请求参数名
//        kaptchaFilter.setKaptcha("kaptcha");
//        kaptchaFilter.setPostOnly(false);
//        //指定认证管理器
//        kaptchaFilter.setAuthenticationManager(authenticationManagerBean());
//
//        //指定认证成功和失败处理
//        // kaptchaFilter.setAuthenticationSuccessHandler(new MyAuthenticationSuccessHandler());
//        // kaptchaFilter.setAuthenticationFailureHandler(new MyAuthenticationFailureHandler());
//
//        //指定处理登录
//        kaptchaFilter.setFilterProcessesUrl("/login/form");
//        kaptchaFilter.setUsernameParameter("username");
//        kaptchaFilter.setPasswordParameter("password");
//        return kaptchaFilter;
//    }
//
//    @Bean
//    public PasswordEncoder passwordEncoder() {
//        return NoOpPasswordEncoder.getInstance();
//    }
//
//
//    @Override
//    public void configure(WebSecurity web) throws Exception {
//
//    }
//
//    @Override
//    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        auth.userDetailsService(detailsService());
//    }
//
//    @Bean
//    public UserDetailsService detailsService() {
//        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//
//        UserDetails build1 = User.withUsername("admin").password("123456").roles("USER").build();
//        UserDetails build2 = User.withUsername("user").password("123456").roles("USER").build();
//        manager.createUser(build1);
//        manager.createUser(build2);
//
//        return manager;
//    }
//
//
//    @Override
//    @Bean
//    public AuthenticationManager authenticationManagerBean() throws Exception {
//        return super.authenticationManagerBean();
//    }
//
//
//}
